var assert = require('assert');
var logger = using('easynode.framework.Logger').forFile(__filename);
var GenericObject = using('easynode.GenericObject');
var BeanFactory = using('easynode.framework.BeanFactory');
var thunkify = require('thunkify');
var fs=require('fs');
var OAuth = require('co-wechat-oauth');

(function () {
        const  TOKEN_ID='token_id_oauth'
        /**
         * Class WXApi
         *
         * @class #NAMESPACE#.WXApi
         * @extends easynode.GenericObject
         * @since 0.1.0
         * @author zlbbq
         * */
        class WXApi extends GenericObject {
                /**
                 * 构造函数。
                 *
                 * @method 构造函数
                 * @since 0.1.0
                 * @author zlbbq
                 * */
                constructor() {
                        super();
                        //调用super()后再定义子类成员。
                        this.cache = null;
                }

                /**
                 * 初始化连接参数。
                 *
                 * @method get
                 * @param {String} key 键
                 * @param {Object} defaultValue 默认值，默认null
                 * @return {Object} 返回缓存的值
                 * @async
                 * @since 0.1.0
                 * @author zlbbq
                 * */
                initialize(appid, secret) {
                        var me=this;
                        var client = new OAuth(appid,secret,
                        function * (openid) {
                                // 传入一个根据openid获取对应的全局token的方法
                                var txt =  yield me.cache.get(openid +'_'+TOKEN_ID);
                                logger.error(JSON.stringify(txt));
                                return txt;
                        }, function* (openid, token) {
                                // 请将token存储到全局，跨进程、跨机器级别的全局，比如写到数据库、redis等
                                // 这样才能在cluster模式及多机情况下使用，以下为写入到文件的示例
                                // 持久化时请注意，每个openid都对应一个唯一的token!
                                yield me.cache.set(openid +'_'+TOKEN_ID, token);
                        });
                        EasyNode.DEBUG && logger.debug("WX OAUTH INITED");
                        this._client=client;
                }



                getAuthorizeURL(redirectUrl, state, scope)
                {
                        var me=this;
                                var url=me._client.getAuthorizeURL(redirectUrl, state, scope);
                                return url;
                }

                getAccessToken(code)
                {
                        var me=this;
                        return function *()
                        {
                                var token=yield me._client.getAccessToken(code);
                                return token;
                        }
                }


                getClassName() {
                        return EasyNode.namespace(__filename);
                }
        }

        module.exports = WXApi;
})();